class Solution:
    def removeDuplicateLetters(self, s: str) -> str:
        """
        使用贪心算法去除重复字母，保证字典序最小
        
        算法思路：
        1. 统计每个字符的出现次数
        2. 使用栈维护结果，确保字典序最小
        3. 对于每个字符，如果栈顶字符大于当前字符且后面还会出现，则弹出
        4. 使用visited集合避免重复添加
        
        Args:
            s: 输入字符串
            
        Returns:
            str: 去除重复字母后字典序最小的字符串
        """
        # 统计每个字符的出现次数
        count = {}
        for char in s:
            count[char] = count.get(char, 0) + 1
        
        # 使用栈存储结果
        stack = []
        # 记录已经在栈中的字符
        visited = set()
        
        for char in s:
            # 减少当前字符的计数
            count[char] -= 1
            
            # 如果字符已经在结果中，跳过
            if char in visited:
                continue
            
            # 贪心策略：如果栈顶字符大于当前字符，且栈顶字符后面还会出现，则弹出
            while (stack and 
                   stack[-1] > char and 
                   count[stack[-1]] > 0):
                removed = stack.pop()
                visited.remove(removed)
            
            # 将当前字符加入结果
            stack.append(char)
            visited.add(char)
        
        return ''.join(stack)
